package com.yxp.offer;

/**
 * @author : yang.xp
 * @date : 2021/9/2 9:19
 * @description : 剑指 Offer 65. 不用加减乘除做加法
 * 写一个函数，求两个整数之和，要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
 * TODO 利用位运算 计算加减乘除
 * 2 0010
 * 3 0011
 * 5 0101
 *
 * te   c     a    b
 * 1    0100  0001 0100
 * 2    0000  0101 0000
 * return 0101
 * <p>
 * <p>
 * 12 0000 1100
 * 18 0001 0010
 * 30 0001 1110
 */
public class Problem65 {

    public static void main(String[] args) {
        Problem65 problem65 = new Problem65();
        System.out.println(2 ^ 3);
        System.out.println(problem65.add(2, 3));
    }

    public int add(int a, int b) {
        while (b != 0) { // 当进位为 0 时跳出, 就是不能进位，再计算非进位的值。
            int c = (a & b) << 1;  // c = 进位上的值
            a ^= b; // a = 非进位和
            b = c; // b = 进位
        }
        return a;
    }
}
